/**
 * 项目名：	Rumba Plan
 * 
 * 版权所有(C)，上海海鼎信息工程股份有限公司，2006，所有权利保留。
 * 
 * 文件名：	HFieldEntity.java
 * 模块说明：	
 * 修改历史：
 * 2006-8-9 - lxm - 创建。
 */
package com.hd123.rumba.jsp;

import org.apache.ecs.html.Input;

import com.hd123.rumba.gwt.base.client.BUCN;
import com.hd123.rumba.gwt.base.client.biz.BSimpleBasic;
import com.hd123.rumba.request.Dictionary;
import com.hd123.rumba.util.AccessMode;

/**
 * 基本资料输入框 | 服务端界面控件
 * <p>
 * 
 * 页面模型：<br>
 * <table border=0 cellspacing=3 cellpadding=0>
 * <tr bgcolor=skyblue>
 * <td>界面元素</td>
 * <td>对象属性</td>
 * <td>备注</td>
 * </tr>
 * <tr>
 * <td><code>&lt;td&gt;</code></td>
 * <td><i>tdLabel</i></td>
 * <td></td>
 * </tr>
 * <tr bgcolor=aliceblue>
 * <td><code>&nbsp;&nbsp;...</code></td>
 * <td>参见{@link LabelHField LabelHField}</td>
 * <td></td>
 * </tr>
 * <tr>
 * <td><code>&lt;td&gt;</code></td>
 * <td><i>tdContent</i></td>
 * <td></td>
 * </tr>
 * <tr bgcolor=aliceblue>
 * <td><code>&nbsp;&nbsp;&lt;input type=hidden&gt;</code></td>
 * <td>inputUuid</td>
 * <td>id=<i>name</i>。</td>
 * </tr>
 * <tr>
 * <td><code>&nbsp;&nbsp;&lt;input type=text&gt;</code></td>
 * <td>inputCode</td>
 * <td>仅当style=VALUE_STYLE_LONG时有效。id=<i>name</i>_code。</td>
 * </tr>
 * <tr bgcolor=aliceblue>
 * <td><code>&nbsp;&nbsp;&lt;input type=text&gt;</code></td>
 * <td>inputName</td>
 * <td>仅当style=VALUE_STYLE_LONG时有效。id=<i>name</i>_name。</td>
 * </tr>
 * <tr>
 * <td><code>&nbsp;&nbsp;&lt;input type=text&gt;</code></td>
 * <td>inputCodeName</td>
 * <td>仅当style=VALUE_STYLE_SHORT时有效。id=<i>name</i>_codeName。</td>
 * </tr>
 * </table>
 * 
 * @author lxm
 * 
 */
public class HFieldBasic extends LabelHField {

  public HFieldBasic(Dictionary dd, String name, String caption, BSimpleBasic value, Object[] params) {
    super(dd, name, caption, value, params);
  }

  public HFieldBasic(Dictionary dd, String name, String caption, BSimpleBasic value) {
    super(dd, name, caption, value);
  }

  /** style取值：短格式。只显示一个用于同时显示代码和名称的输入框inputCodeName。 */
  public static final Integer VALUE_STYLE_SHORT = new Integer(0);
  /** style取值：长格式。同时显示两个输入框，分别用于显示代码和名称，其中显示代码的可写，显示名称的则只读。 */
  public static final Integer VALUE_STYLE_LONG = new Integer(1);

  /** 属性：风格。可能的取值参见以“VALUE_STYLE_*”开头的常量。默认为VALUE_STYLE_LONG。 */
  private Integer style;
  private String onValidateJS;
  private String onChangedJS;
  private Input inputUuid;
  private Input inputCode;
  private Input inputName;
  private Input inputCodeName;

  /**
   * 属性：风格。可能的取值参见以“VALUE_STYLE_*”开头的常量。默认为VALUE_STYLE_LONG。<br>
   * 对应的参数名"style"，下一参数类型为Integer。
   */
  public Integer getStyle() {
    return style;
  }

  public void setStyle(Integer style) {
    this.style = style;
  }

  /**
   * 属性：当代码改变后被触发被调用。<br>
   * 对应的参数名"onValidateJS"，下一参数类型为String。
   * <p>
   * 
   * 通常情况下这应该指向一个javascript的函数名，该函数将在代码被改变后被触发。具体说明如下（以下说明为js语法）：<br>
   * 要求根据输入的代码，返回是否合法，若合法则返回基本资料的有关信息。<br>
   * <code>Object function (code)</code><br>
   * 参数：<br>
   * <dd>String - code 用户修改后新的代码。不允许空。可能会传入空字符串。</dd>
   * <br>
   * 返回值：若找不到指定的基本资料，则返回null；若找的到则返回以下结构：<br>
   * <dd>result.uuid String，基本资料的uuid。</dd>
   * <br>
   * <dd>result.code String，基本资料的代码。</dd>
   * <br>
   * <dd>result.name String，基本资料的名称或标题。</dd>
   * <br>
   */
  public String getOnValidateJS() {
    return this.onValidateJS;
  }

  public void setOnValidateJS(String onValidateJS) {
    this.onValidateJS = onValidateJS;
  }

  /**
   * 属性：当所对应的基本资料对象被修改后触发。<br>
   * 对应的参数名"onChangedJS"，下一参数类型为String。
   * <p>
   * 
   * 通常情况下这应该指向一个javascript的函数名，该函数将在代码被改变后被触发。具体说明如下（以下说明为js语法）：<br>
   * <code>Object function (sender, uuid, code, name)</code><br>
   * 参数：<br>
   * <dd>RFieldBasic - sender 发起该事件的对象。</dd>
   * <br>
   * <dd>String - uuid 基本资料的uuid。当没有对应的基本资料对象的时候，将传入undefined。</dd>
   * <br>
   * <dd>String - code 基本资料的代码。当没有对应的基本资料对象的时候，将传入undefined。</dd>
   * <br>
   * <dd>String - name 基本资料的名称或标题。当没有对应的基本资料对象的时候，将传入undefined。</dd>
   * <br>
   */
  public String getOnChangedJS() {
    return onChangedJS;
  }

  public void setOnChangedJS(String onChangedJS) {
    this.onChangedJS = onChangedJS;
  }

  /**
   * 只读属性：存放代码的界面元素&lt;input type=text&gt;<br>
   * 界面元素id和name属性默认=name+"_code"。<br>
   * 对应的参数名"inputCode"。
   */
  public Input getInputCode() {
    if (inputCode == null) {
      inputCode = new Input();
      inputCode.setType("text");
      inputCode.setName(this.getName() + "_code");
      inputCode.setID(this.getName() + "_code");
    }
    return inputCode;
  }

  /**
   * 只读属性：存放代码和名称的界面元素&lt;input type=text&gt;<br>
   * 界面元素id和name属性默认=name+"_codeName"。<br>
   * 对应的参数名"inputCodeName"。
   */
  public Input getInputCodeName() {
    if (inputCodeName == null) {
      inputCodeName = new Input();
      inputCodeName.setType("text");
      inputCodeName.setName(this.getName() + "_codeName");
      inputCodeName.setID(this.getName() + "_codeName");
    }
    return inputCodeName;
  }

  /**
   * 只读属性：存放名称的界面元素&lt;input type=text&gt;<br>
   * 界面元素id和name属性默认=name+"_name"。<br>
   * 对应的参数名"inputName"。
   */
  public Input getInputName() {
    if (inputName == null) {
      inputName = new Input();
      inputName.setType("text");
      inputName.setName(this.getName() + "_name");
      inputName.setID(this.getName() + "_name");
    }
    return inputName;
  }

  /**
   * 只读属性：存放uuid的界面元素&lt;input type=hidden&gt;<br>
   * 界面元素id和name属性默认=name。<br>
   * 对应的参数名"inputUuid"。
   */
  public Input getInputUuid() {
    if (inputUuid == null) {
      inputUuid = new Input();
      inputUuid.setType("hidden");
      inputUuid.setName(this.getName());
      inputUuid.setID(this.getName());
    }
    return inputUuid;
  }

  protected boolean readParam(String paramName, Object paramValue) {
    if (super.readParam(paramName, paramValue))
      return true;
    if ("style".equals(paramName)) {
      style = (Integer) paramValue;
      return true;
    }
    if ("onValidateJS".equals(paramName)) {
      onValidateJS = ((String) paramValue).trim();
      return true;
    }
    if ("onChangedJS".equals(paramName)) {
      onChangedJS = ((String) paramValue).trim();
      return true;
    }
    return false;
  }

  public void build() {
    super.build();
    if (accessMode == AccessMode.READWRITE) {
      StringBuffer sb = new StringBuffer();
      sb.append("<script language='javascript'>\n");
      sb.append(this.buildJS());
      for (int i = 0; i < this.buttons.size(); i++) {
        String s = this.buttons.get(i).buildJS();
        if (s != null)
          sb.append(s);
      }
      sb.append("</script>");
      this.getTdContent().addElement(sb.toString());
    }
  }

  protected void buildHTML(int accessMode, int promptMode) {
    super.buildHTML(accessMode, promptMode);

    BSimpleBasic sbasic = (BSimpleBasic) this.getValue();

    Input inputUuid = this.getInputUuid();
    if (sbasic != null)
      inputUuid.setValue(sbasic.getUuid());
    this.assignElementAttrs(inputUuid, "inputUuid");
    this.getTdContent().addElement(inputUuid);

    if (VALUE_STYLE_SHORT.equals(style)) {

      Input inputCodeName = this.getInputCodeName();
      if (accessMode == AccessMode.READWRITE)
        inputCodeName.setClass("small_input");
      else {
        inputCodeName.setClass("small_input_static");
        inputCodeName.setReadOnly(true);
      }
      if (sbasic != null && accessMode != AccessMode.INVISIBLE)
        inputCodeName.setValue(sbasic.getNameCode());
      this.assignElementAttrs(inputCodeName, "inputCodeName");
      this.getTdContent().addElement(inputCodeName);
      this.getLabel().setFor(this.getName() + "_codeName");

    } else {

      Input inputCode = this.getInputCode();
      if (accessMode == AccessMode.READWRITE)
        inputCode.setClass("small_input");
      else {
        inputCode.setClass("small_input_static");
        inputCode.setReadOnly(true);
      }
      if (sbasic != null && accessMode != AccessMode.INVISIBLE)
        inputCode.setValue(sbasic.getCode());
      this.assignElementAttrs(inputCode, "inputCode");
      this.getTdContent().addElement(inputCode);
      this.getLabel().setFor(this.getName() + "_code");

      Input inputName = this.getInputName();
      inputName.setClass("small_input_static");
      inputName.setSize(32);
      inputName.setReadOnly(true);
      inputName.setTabindex(-1);
      if (sbasic != null && accessMode != AccessMode.INVISIBLE)
        inputName.setValue(sbasic.getName());
      this.assignElementAttrs(inputName, "inputName");
      this.getTdContent().addElement(inputName);
    }
  }

  protected String buildJS() {
    StringBuffer sb = new StringBuffer();
    sb.append("var ctrl = new RFieldBasic();\n");
    if (this.getIsRequired().booleanValue())
      sb.append("ctrl.required = true;\n");
    sb.append("ctrl.bind($('" + this.getName() + "')," + " $('" + this.getName() + "_code'),"
        + " $('" + this.getName() + "_name'), $('" + this.getLabel().getAttribute("id") + "'));\n");
    if (this.onValidateJS != null && !"".equals(this.onValidateJS))
      sb.append("ctrl.onValidate.attach(" + this.onValidateJS + ");\n");
    if (this.onChangedJS != null && !"".equals(this.onChangedJS))
      sb.append("ctrl.onChanged.attach(" + this.onChangedJS + ");\n");
    return sb.toString();
  }

}
